iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 9
0

在經過某大神朋友提點之前,對於 interface 有點理解錯誤,也不能說是錯誤,應該是說與 interface 設計初衷不大符合。

理解錯誤的部分就不提了,就直接來談談 interface 設計的最初始用途吧!

它好比一個模板,在其中定義了對像必須實現的成員,通過類別或結構來實現它。

這裡有兩個重點:

  1. 定義了對象必須實現的成員。
  2. 通過類別來實現它。

由此得知 interface 必須定義一些成員,但卻不能對該成員有實作。

該大神朋友舉的例子我覺得很適合幫助了解,在此分享一下。

  1. 我們可以將 interface 想像成問券,問券本身定義了很多問題(成員),但卻還沒有填寫(未實作)。
  2. 而當我們將問券( interface ) 交給人來填寫( implement ),人們會依照問券上的問題一一回答(實作)。

若是依照第一段落來理解,先來了小總結。

interface 應該是將一些共用的 function 定義出來等待 class 來實作。

若是依照這個小總結,再回去看 [Day 8],我們就應該要將程式碼再加上 interface重新整理一下。


interface 是要將共用的 function 定義出來等 class 實作。
所以在這個例子來說,應該是要將 Car 的共用 function 定義在 interface 而不是在 class Car,所以應該是要這樣寫。

interface Car {
    fun drive()
}

而車子如何開,應該是由 implement 的 class 來實作(決定怎麼開)。

interface Car {
  fun drive()
}

class Model3(): Car {
  override fun drive() {
    //drive by electric
  }
}

class RAV4(): Car {
  override fun drive() {
    //drive by oil
  }
}

而在 implement 的 class 就必須實作在 interface 定義的 function , model3 是電能車 RAV4 是油車,所以在創立這兩個 class 時必須對 drive 做不同的實作。

而兩個 class 定義完後,後續利用這兩個 class 實例化出來的物件便會擁有不同的 drive 實作。


最後再舉個不同的例子加深印象。

//這個例子是用遊戲腳色來作為例子
//interface 要定義一些所有腳色共有的 fcuntion
interface BasicFunction {
  var position: Int
  fun walk()
  fun attack(enemyHP: Int): Int
}

//class implement interface 來實作該function 
class Warrior() {
  
  //戰士類有一起始位置為 0
  override var position = 0
  
  //戰士類有一 function walk 可以改變起始位置
  override fun walk() {
    position += 1
  }
  
  //戰士類有一 function attack ,需有一參數 敵人的血量傳入,並且會依照傳入值 - 10回傳
  override fun attack(enemyHP: Int): Int {
    return enemyHP - 10
  }
}

//宣告一戰士-亞拉岡,此戰士擁有 Warrior 所有實作
val Aragorn = Warrior()

上一篇
[Day 8] Kotlin 語法 - 類別( Class )與物件( Object)
下一篇
[Day 10] Kotlin 語法 - Nullable? Kotlin V.S Java (1)
系列文
Android心得筆記×Kotlin語法初探 不是新手村 是嬰兒村30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言